package cn.com.bluemoon.daps.sync.core.sync.sql.mysql.datatype.other;

import cn.com.bluemoon.daps.sync.core.sync.sql.mysql.datatype.DataType;
import com.google.common.collect.ImmutableSet;

import java.util.Set;
import java.util.regex.Pattern;

/**
 * @author Jarod.Kong
 * @date 2021/7/22 11:40
 */
public class ExpressionStringDataType implements DataType {

    /**
     * 默认值处理
     * 是否加单引号 等
     * json为null，不可以用默认值
     * The BLOB, TEXT, GEOMETRY, and JSON data types cannot be assigned a default value.
     * <pre>
     *  BLOB， TEXT， GEOMETRY，和 JSON数据类型可分配仅当值被写入作为表达，即使表情值是一个文字一个缺省值：
     *
     * 这是允许的（文字默认指定为表达式）：
     *
     * CREATE TABLE t2 (b BLOB DEFAULT ('abc'));
     * 这会产生错误（文字默认值未指定为表达式）：
     *
     * CREATE TABLE t2 (b BLOB DEFAULT 'abc');
     * 表达式默认值必须遵守以下规则。如果表达式包含不允许的构造，则会发生错误。
     *
     * 允许使用文字、内置函数（确定性和非确定性）和运算符。
     *
     * 不允许使用子查询、参数、变量、存储函数和可加载函数。
     *
     * 表达式默认值不能依赖于具有该AUTO_INCREMENT属性的列。
     * </pre>
     * <a href="https://dev.mysql.com/doc/refman/8.0/en/data-type-defaults.html">参考</a>
     *
     * @param defaultValue source
     * @return target
     */
    @Override
    public Object cast(Object defaultValue) {
        if (defaultValue == null) {
            return null;
        }
        // 若为''直接返回
        if (defaultValue.toString().trim().equalsIgnoreCase("''")){
            return defaultValue;
        }
        boolean isExpression = Pattern.matches("\\('.*'\\)", defaultValue.toString());
        return isExpression ? defaultValue : wrapper(defaultValue, SINGLE_QUOTE);
    }


    /**
     * @return 名称
     */
    @Override
    public Set<String> name() {
        return ImmutableSet.of("blob", "text", "geometry", "json");
    }
}
